Interceptors এর মাধ্যমে Detailed Logging

Web Development - অ্যাপাচি সিএক্সএফ (Apache CXF) - Logging এবং Monitoring (লগিং এবং মনিটরিং) |
2
2

Apache CXF এ Interceptors একটি গুরুত্বপূর্ণ উপাদান যা SOAP বা RESTful মেসেজ প্রক্রিয়াকরণের বিভিন্ন ধাপে কাজ করে। এগুলি মেসেজের ইনপুট এবং আউটপুট ফেজে বিভিন্ন ক্রিয়াকলাপ (যেমন: লগিং, অথেন্টিকেশন, এনক্রিপশন, ফল্ট হ্যান্ডলিং) সম্পাদন করতে ব্যবহৃত হয়। বিশেষত detailed logging এর জন্য Interceptors অত্যন্ত কার্যকরী, কারণ এটি ওয়েব সার্ভিসের মেসেজের প্রতিটি ধাপের বিস্তারিত লগ রাখার সুবিধা দেয়।

এখানে, আমরা দেখব কিভাবে Interceptors ব্যবহার করে Apache CXF এ ডিটেইলড লগিং ইমপ্লিমেন্ট করা যায়।


Interceptors এর মাধ্যমে Logging প্রক্রিয়া

Apache CXF এ Logging করতে হলে আপনাকে InInterceptor এবং OutInterceptor ক্লাস ব্যবহার করতে হবে। এগুলি ইনপুট (request) এবং আউটপুট (response) মেসেজে ইন্টারসেপ্ট করে। এছাড়া আপনি লগিংয়ের জন্য কোনো তৃতীয় পক্ষের লাইব্রেরি (যেমন SLF4J, Log4j) ব্যবহার করতে পারেন।


1. CXF Interceptor দিয়ে Detailed Logging বাস্তবায়ন

InInterceptor এবং OutInterceptor এর মাধ্যমে SOAP বা RESTful মেসেজে লগিং করা যাবে। InInterceptor মেসেজ গ্রহণের আগে এবং OutInterceptor মেসেজ প্রেরণের আগে কাজ করে।

1.1 LoggingInterceptor উদাহরণ

এখানে একটি কাস্টম ইন্টারসেপ্টর তৈরি করা হয়েছে যা SOAP মেসেজের ইনপুট এবং আউটপুটের বিস্তারিত লগ রাখবে।

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.AbstractPhaseInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingInterceptor extends AbstractPhaseInterceptor<Message> {

    private static final Logger LOG = LoggerFactory.getLogger(LoggingInterceptor.class);

    public LoggingInterceptor() {
        super(Phase.PRE_INVOKE);  // Set the phase in which this interceptor will run
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        if (message instanceof SoapMessage) {
            SoapMessage soapMessage = (SoapMessage) message;
            
            // Log the incoming message
            LOG.info("Incoming SOAP Request: " + soapMessage.toString());

            // If you need to log the SOAP body, you can extract and log it here
            Object body = soapMessage.getContent(Object.class);
            LOG.info("SOAP Body: " + body);
        }
    }

    @Override
    public void handleFault(Message message) {
        if (message instanceof SoapMessage) {
            SoapMessage soapMessage = (SoapMessage) message;
            
            // Log the fault message (if any)
            LOG.error("Fault occurred: " + soapMessage.getContent(Exception.class));
        }
    }
}

1.2 LoggingInterceptor Registering with CXF

এই ইন্টারসেপ্টরটি CXF ওয়েব সার্ভিসে রেজিস্টার করতে হবে, যাতে এটি SOAP মেসেজের ইনপুট এবং আউটপুট লগ করতে পারে।

import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.endpoint.ServerImpl;

public class LoggingServer {
    public static void main(String[] args) {
        HelloWorldImpl implementor = new HelloWorldImpl();
        EndpointImpl endpoint = new EndpointImpl(implementor);

        // Register the logging interceptor
        endpoint.getInInterceptors().add(new LoggingInterceptor());
        endpoint.getOutInterceptors().add(new LoggingInterceptor());

        // Publish the endpoint
        endpoint.publish("http://localhost:8080/helloWorld");
    }
}

এখানে, LoggingInterceptor ইনপুট এবং আউটপুট উভয় ক্ষেত্রেই রেজিস্টার করা হয়েছে। তাই, যখন ক্লায়েন্ট ওয়েব সার্ভিসে রিকোয়েস্ট পাঠাবে, তখন ইনপুট মেসেজ লগ হবে এবং সার্ভার থেকে আউটপুট পাঠানোর আগে তা লগ হবে।

1.3 Detailed Logs for RESTful Services

RESTful সার্ভিসে ইন্টারসেপ্টর ব্যবহার করে লগিং করতে হলে, CXF এর InInterceptor এবং OutInterceptor ব্যবহার করা যেতে পারে। নিচে একটি উদাহরণ দেখানো হয়েছে:

import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.interceptor.AbstractMessageInterceptor;
import org.apache.cxf.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RESTLoggingInterceptor extends AbstractMessageInterceptor<Message> {

    private static final Logger LOG = LoggerFactory.getLogger(RESTLoggingInterceptor.class);

    public RESTLoggingInterceptor() {
        super(Phase.RECEIVE);  // Receive phase for inbound messages
    }

    @Override
    public void handleMessage(Message message) {
        // Log incoming request URI
        String requestURI = (String) message.get(MessageContext.REQUEST_URI);
        LOG.info("Incoming REST Request: " + requestURI);

        // Log HTTP headers (if necessary)
        @SuppressWarnings("unchecked")
        Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
        LOG.info("Request Headers: " + headers.toString());

        // Log the request body (for debugging purposes)
        String body = (String) message.getContent(String.class);
        LOG.info("Request Body: " + body);
    }

    @Override
    public void handleFault(Message message) {
        // Log error or fault details
        LOG.error("Fault occurred while processing the request.");
    }
}

এটি Phase.RECEIVE তে কাজ করবে, যা ইনপুট মেসেজে লগ রাখা হবে। এখানে ক্লায়েন্টের URI, হেডার, এবং বডি লগ করা হচ্ছে। আপনিও চাইলে আরও বিস্তারিত তথ্য লগ করতে পারেন।


2. SLF4J এবং Log4j ব্যবহার করে Logging

Apache CXF এর লগিং আরও কার্যকরী এবং সহজভাবে পরিচালনা করতে আপনি SLF4J এবং Log4j ব্যবহার করতে পারেন।

2.1 Maven Dependency for SLF4J and Log4j

Maven প্রজেক্টে SLF4J এবং Log4j ডিপেনডেন্সি যোগ করতে হবে:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.32</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.14.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>

2.2 Log4j Configuration File

Log4j কনফিগারেশন ফাইল (log4j2.xml) তৈরির মাধ্যমে লগের স্তর এবং আউটপুট নির্ধারণ করা যায়:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

এটি SLF4J এবং Log4j এর মাধ্যমে লগ সংরক্ষণ এবং কনসোলে প্রদর্শন করতে সাহায্য করবে।


সারাংশ

Apache CXF এ Interceptors ব্যবহার করে SOAP এবং RESTful সার্ভিসের ইনপুট এবং আউটপুট মেসেজের বিস্তারিত লগিং করা যেতে পারে। এটি ডিবাগিং এবং সমস্যা সমাধানে সহায়তা করে। SLF4J এবং Log4j এর মাধ্যমে লগিংয়ের আউটপুট কাস্টমাইজ করা যায়, যা উন্নত পর্যায়ের লগিং পরিচালনায় কার্যকরী।

Content added By
Promotion